<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>


        // function outer(num1){
        //     return function inner(num2){
        //         return num1+num2
        //     }
        // }

        // const func1 = outer(10);
        // // func1  等同于inner函数 
        // func1(20);  // 10+20
        // func1(50); // 10+50
        // https://www.baidu.com:443/s?name=zhangsan&age=18#abc
        // 协议://域名或者ip地址:端口号/路径?参数#锚点  

        // 固定的是 一定会有 协议+ 域名+端口号 
        // 变化的是 路径  参数   锚点 

        //  让用户传递 参数  将参数拼接成一个完成的路径 
        // function fn(a,b,c,d){
        //     return a+'://'+b+':'+c+d
        // }
        // 功能函数必须传  协议域名端口号  必须传
        // 基础参数 可传 可不传 

        // function currying(功能函数,基础参数){
        
            // 收集参数  判断 收集的参数 满不满足 功能函数的要求
            // 如果没够 继续收集  调用currying 调用自己 继续收集 

            // 如果够了 执行功能函数

        // }


        // const f1 = currying(fn,'http','localhost','8080')
        // f1('/h5')
        // http://localhost:8080/h5


        // const f2 = currying(fn,'http','localhost')
        // f2('8080','/h5')
        // f2('8080')('/h5')
        // http://localhost:8080/h5



        // const f3 = currying(fn,'http')
        // f3('localhost','8080','/h5')
        // f3('localhost')('8080')('/h5')

        
        // http://localhost:8080/h5

        // 准备好一个功能函数   
        // 这个功能函数需要传 4个参数   

        function fn(a,b,c,d){
            return a+'://'+b+':'+c+d
        }

        //函数名.length 
        // 得到 函数形参的个数 
        // alert(fn.length);

        // 10+x

        

        function currying(fn1,...args){
            // 收集参数  判断args 里边有几个 如果 不够4个
            // 继续调用 currying 收集  
            // 如果够了4个  fn1 满足要求了 fn1被执行  
            let _arg  = args || [];
            const len = fn1.length; // 功能函数形参的个数
            return function(...args){
                _arg = [..._arg,...args];
                console.log(_arg);
                if(_arg.length < len){
                    return currying(fn1,..._arg); 
                    //
                    // 几次收集的应该拼接在一起 继续收集 
                    // 展开以后传给currying
                }
                else{
                    return fn1(..._arg); //收集完的给到fn1
                }
            }

        }


        //只准备一个参数 
        // const r1 = currying(fn,'https')
        // console.log(r1('www.baidu.com','8080','/a'));

        // const r2 = r1('www.baidu.com');
        // const r3 = r2('8080');
        // const r4 = r3('/a');

        // console.log(r4);
        // 上面的 r2 r3 r4 可以简写成下面一行  
        // console.log(r1('www.baidu.com')('8080')('/a'));


        // 准备两个参数  
        // const r1 = currying(fn,'https','www.baidu.com')
        // // console.log(r1('8080','/a'));

        // // const r2 = r1('8080');
        // // const r3 = r2('/a');

        // // console.log(r3);
        // // 上面的 r2 r3 可以简写成下面一行  
        // console.log(r1('8080')('/a'));


        //准备三个参数
        // const r1 = currying(fn,'https','www.baidu.com','8888')
        // console.log(r1('/a'));



        // // 准备0个参数  

        // const r1 = currying(fn)
        // const r2 = r1('https');
        // const r3 = r2('www.baidu.com');
        // const r4 = r2('8085');
        // const r5 = r2('/html5');

        // console.log(r5);

        // console.log(r1('https')('www.baidu.com')('8080')('html5'));



      
        
    </script>
</body>
</html>